package org.minuframework.mybatis;

import java.io.Serializable;
import java.util.Collection;
import java.util.Map;

import org.minuframework.exception.ExceptionFailed;

/**
 * @author 米mi
 * @param  <J> ？ extends JsonResult
 * @param  <T> 实体映射类
 */
public interface IService<J extends JsonResult, T> {
    
    /**
     * 根据ID查询
     * @param  id ID
     * @return    T
     */
    T selectById(Serializable id);
    
    /**
     * 根据ID查询
     * @param  id   ID
     * @param  name 属性名
     * @return      T
     */
    T selectById(Serializable id, String name);
    
    /**
     * 根据ID查询（适用于多主键）
     * @param  keys            属性名
     * @param  values          属性值
     * @return                 T
     * @throws ExceptionFailed
     */
    T selectById(String[] keys, Object[] values) throws ExceptionFailed;
    
    /**
     * 查询总数
     * @return int
     */
    int selectCount();
    
    /**
     * 根据ID查询总数
     * @param  id ID
     * @return    int
     */
    int selectCountById(Serializable id);
    
    /**
     * 根据ID查询总数
     * @param  id   ID
     * @param  name 属性名
     * @return      int
     */
    int selectCountById(Serializable id, String name);
    
    /**
     * 根据ID查询总数（适用于多主键）
     * @param  keys            属性名
     * @param  values          属性值
     * @return                 int
     * @throws ExceptionFailed
     */
    int selectCountById(String[] keys, Object[] values) throws ExceptionFailed;
    
    /**
     * 新增
     * @param  params 参数map
     * @return        JsonResult
     */
    J save(Map<String, Object> params) throws ExceptionFailed;
    
    /**
     * 删除
     * @param  params 参数map
     * @return        JsonResult
     */
    J delete(Map<String, Object> params);
    
    /**
     * 批量删除
     * @param  list ID集合
     * @return      JsonResult
     */
    J deleteBatch(Collection<? extends Serializable> list);
    
    /**
     * 批量删除
     * @param  list ID集合
     * @param  name 属性名
     * @return      JsonResult
     */
    J deleteBatch(Collection<? extends Serializable> list, String name);
    
    /**
     * 更新
     * @param  params 参数map
     * @return        JsonResult
     */
    J update(Map<String, Object> params) throws ExceptionFailed;
    
    /**
     * 冻结
     * @param  params 参数map
     * @return        JsonResult
     */
    J updateStatus(Map<String, Object> params);
    
    /**
     * 查询
     * @param  params 参数map
     * @return        JsonResult
     */
    J select(Map<String, Object> params);
    
    /**
     * 批量查询
     * @param  params 参数map
     * @return        JsonResult
     */
    J selectList(Map<String, Object> params);
    
    /**
     * 批量查询（分页）
     * @param  params 参数map
     * @return        JsonResult
     */
    J selectByPage(Map<String, Object> params);
    
    /**
     * 批量查询（分页）
     * @param  params 参数map
     * @param  keys   length为2，当前页（默认pageNum），每页记录数（默认pageSize），顺序不能反
     * @return        JsonResult
     */
    J selectByPage(Map<String, Object> params, String[] keys);
    
}
